package com.drerp.RH.carreira.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.drerp.RH.Cargo;
import com.drerp.RH.Colaborador;
import com.drerp.RH.carreira.AcaoPlanoCarreira;
import com.drerp.RH.carreira.CondicaoPlanoCarreira;
import com.drerp.RH.carreira.Metrica;
import com.drerp.RH.carreira.RegraPlanoCarreira;
import com.drerp.RH.carreira.DAO.AcaoPlanoCarreiraDAO;
import com.drerp.RH.carreira.DAO.CondicaoPlanoCarreiraDAO;
import com.drerp.RH.carreira.DAO.MetricaDAO;
import com.drerp.RH.carreira.DAO.RegraPlanoCarreiraDAO;
import com.drerp.RH.carreira.constantes.ComparadoresMetrica;
import com.drerp.RH.carreira.constantes.TiposAcaoPlanoCarreira;
import com.drerp.RH.carreira.constantes.TiposRegraPlanoCarreira;
import com.drerp.RH.carreira.constantes.UnidadesMetrica;
import com.drerp.util.Constantes;

public class SalvarCarreiraServlet extends HttpServlet {
	private static final long serialVersionUID = -7011602109551632390L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String url = request.getRequestURI();
		
		try {
			String nome = request.getParameter("nome");
		
			int tipoRegraIdx = Integer.parseInt(request.getParameter("tipo"));
			TiposRegraPlanoCarreira tipoRegra = TiposRegraPlanoCarreira.values()[tipoRegraIdx];
			
			Cargo cargoAlvo = null;
			Colaborador colaboradorAlvo = null;
			
			if (tipoRegra != TiposRegraPlanoCarreira.GERAL) {
				long cargoId = Long.parseLong(request.getParameter("cargo"));
				cargoAlvo = Cargo.encontrarCargoPorId(cargoId);
			}
			
			if (tipoRegra == TiposRegraPlanoCarreira.FUNCIONARIO) {
				long colaboradorId = Long.parseLong(request.getParameter("funcionario"));
				colaboradorAlvo = Colaborador.encontrarColaboradorPorId(colaboradorId);
			}
			
			long metricaId = Long.parseLong(request.getParameter("metrica"));
			Metrica metrica = Metrica.encontrarMetricaPorId(metricaId);
			
			int comparadorIdx = Integer.parseInt(request.getParameter("comparador"));
			ComparadoresMetrica comparador = ComparadoresMetrica.values()[comparadorIdx];
			
			int valor = Integer.parseInt(request.getParameter("valor"));
			
			int unidadeIdx = Integer.parseInt(request.getParameter("unidade"));
			UnidadesMetrica unidade = UnidadesMetrica.values()[unidadeIdx];
			
			metrica.setUnidade(unidade);
			MetricaDAO metricaDAO = new MetricaDAO();
			metricaDAO.save(metrica);
			
			int tipoAcaoIdx = Integer.parseInt(request.getParameter("acao"));
			TiposAcaoPlanoCarreira tipoAcao = TiposAcaoPlanoCarreira.values()[tipoAcaoIdx];
			
			long acaoValor = Long.parseLong(request.getParameter("acao_valor"));
			Cargo novoCargo = null;
			if (tipoAcao == TiposAcaoPlanoCarreira.MUDA_CARGO) {
				novoCargo = Cargo.encontrarCargoPorId(acaoValor);
			}
			
			CondicaoPlanoCarreiraDAO condDAO = new CondicaoPlanoCarreiraDAO();
			CondicaoPlanoCarreira cond = new CondicaoPlanoCarreira(metrica, comparador, valor);
			condDAO.save(cond);
			
			AcaoPlanoCarreiraDAO acaoDAO = new AcaoPlanoCarreiraDAO();
			AcaoPlanoCarreira acao;
			if (tipoAcao == TiposAcaoPlanoCarreira.MUDA_CARGO) {
				acao = new AcaoPlanoCarreira(tipoAcao, novoCargo);
			} else {
				acao = new AcaoPlanoCarreira(tipoAcao, (int)acaoValor);
			}
			acaoDAO.save(acao);
			
			RegraPlanoCarreiraDAO regraDAO = new RegraPlanoCarreiraDAO();
			RegraPlanoCarreira regra = null;

			try {
				long regraId = Long.parseLong(request.getParameter("id"));
				regra = RegraPlanoCarreira.getRegraPorId(regraId);
		
			} catch(NumberFormatException e) {
				regra = new RegraPlanoCarreira();
			}
			
			regra.setNome(nome);
			regra.setTipo(tipoRegra);
			regra.setCondicao(cond);
			regra.setAcao(acao);

			switch(tipoRegra) {
				case GERAL:
					break;
				case CARGO:
					regra.setCargoAlvo(cargoAlvo);
					break;
				case FUNCIONARIO:
					regra.setColaboradorAlvo(colaboradorAlvo);
					break;
			}
			
			regraDAO.save(regra);
			
			if (url.endsWith("salvar")) {
				request.getSession().setAttribute(Constantes.SUCCESSS_MSG_SESSION_KEY, "Regra salva com sucesso.");
			} else if (url.endsWith("atualizar")) {
				request.getSession().setAttribute(Constantes.SUCCESSS_MSG_SESSION_KEY, "Regra atualizada com sucesso.");
			}
			response.sendRedirect("lista.jsp");
			
		} catch(Exception e) {
			e.printStackTrace();
			
			request.getSession().setAttribute(Constantes.ERROR_MSG_SESSION_KEY, "Ocorreu um erro.");
			response.sendRedirect("lista.jsp");
		}
	}

}
